/* 
 * ChamadoController.java
 * Copyright (c) Faculdade Anhanguera de Anápolis.
 * Tecnologia em Análise e Desenvolvimento de Sistemas.
 * Projeto Multidisciplinar de Autoaprendizagem.
 *
 * Este software é confidencial e propriedade da Faculdade Anhanguera de Anápolis.
 * Não é permitida sua distribuição ou divulgação do seu conteúdo sem expressa autorização da Faculdade Anhanguera de Anápolis.
 * Este arquivo contém informações proprietárias.
 */
package br.com.pma.chamatec.controller;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.AjaxBehaviorEvent;
import javax.inject.Inject;

import br.com.pma.chamatec.business.IChamadoBO;
import br.com.pma.chamatec.business.IDepartamentoBO;
import br.com.pma.chamatec.business.IUnidadeBO;
import br.com.pma.chamatec.exception.ChamatecExceptionCode;
import br.com.pma.chamatec.exception.ChamatecNegocioException;
import br.com.pma.chamatec.util.EnumResources;
import br.com.pma.entity.Chamado;
import br.com.pma.entity.Departamento;
import br.com.pma.entity.Unidade;
import br.com.pma.entity.Usuario;

/**
 * Controlador para o Caso de Uso Manter Chamado.
 *
 * @author Ludemeula Fernandes de Sá
 */
@ManagedBean
@ViewScoped
public class ChamadoController extends AbstractController {
	private static final long serialVersionUID = -1400661876509004997L;

	@Inject
	private IChamadoBO chamadoBO;

	@Inject
	private IUnidadeBO unidadeBO;

	@Inject
	private IDepartamentoBO departamentoBO;

	@Inject
	private Chamado chamado;

	@Inject
	private Chamado chamadoSearch;

	@Inject
	private Usuario solicitanteSearch;

	private List<Chamado> chamados;
	private List<Unidade> unidades;
	private List<Departamento> departamentos;

	private Boolean isAbrir;
	private Boolean isAvaliar;
	
	/**
	 * @see br.com.pma.chamatec.controller.AbstractController#init()
	 */
	@Override
	@PostConstruct
	public void init() {
		super.init();
		try {
			if (unidades == null || unidades.size() == 0) {
				unidades = unidadeBO.getListDescricao();
			}
			inicializarPesquisa();
		} catch (ChamatecNegocioException e) {
			addFacesMessage(e.getMessage(), FacesMessage.SEVERITY_ERROR);
		} catch (Exception e) {
			montaMensagemGenerica(e);
		}
		
	}

	/**
	 * Inicializa Pesquisa.
	 * 
	 */
	private void inicializarPesquisa() {
		this.chamadoSearch = new Chamado();
		this.solicitanteSearch = new Usuario();
		this.chamados = new ArrayList<Chamado>();
	}
	
	/**
	 * Seta as ações de tela de chamado.
	 * 
	 * @param isAbrir
	 * @param isAvaliar
	 */
	public void setAcoes(Boolean isAbrir, Boolean isAvaliar) {
		this.isAbrir = isAbrir;
		this.isAvaliar = isAvaliar;
	}
	
	/**
	 * Envia para a página de cadastro de Chamado.
	 * 
	 */
	public void abrir() {
		inicializarObjetos();
		mostraCadastro();
		setAcoes(true, false);
	}

	/**
	 * Inicializa os objetos de usuário.
	 * 
	 */
	public void inicializarObjetos() {
		chamado = new Chamado();
		chamado.setUsuarioSolicitacao(usuarioBean.getUsuario());
	}

	/**
	 * Volta para a tela de cadastro.
	 * 
	 */
	public String cancelar() {
		chamados = new ArrayList<Chamado>();
		inicializarObjetos();
		return "index";
	}

	/**
	 * Limpa os campos de pesquisa e a datatable.
	 * 
	 */
	public void limpar() {
		chamados = null;
		chamadoSearch = new Chamado();
		solicitanteSearch = new Usuario();
	}

	/**
	 * Retorna os dados da entidade Chamado.
	 * 
	 */
	public void pesquisar() {
		try {
			chamados = null;
			chamados = chamadoBO.pesquisar(chamadoSearch, solicitanteSearch, usuarioBean.getUsuario());
		} catch (ChamatecNegocioException e) {
			addFacesMessage(e.getMessage(), FacesMessage.SEVERITY_ERROR);
		} catch (Exception e) {
			montaMensagemGenerica(e);
		}
	}

	/**
	 * Salva os dados da entidade Chamado.
	 * 
	 */
	public void salvar() {
		try {
			EnumResources msg = EnumResources.MS_010;
			if (chamado.getId() != null && chamado.getId() != 0) {
				chamado = chamadoBO.avaliar(chamado);
				msg = EnumResources.MS_011;
			}
			else {
				chamado = chamadoBO.salvar(chamado);
			}
			chamado = new Chamado();

			addFacesMessage(msg);
			escondeCadastro();
			inicializarObjetos();
			pesquisar();
		} catch (ChamatecNegocioException e) {
			addFacesMessage(e.getMessage(), FacesMessage.SEVERITY_ERROR);
		} catch (Exception e) {
			montaMensagemGenerica(e);
		}
	}

	/**
	 * Envia para tela de avaliação de chamado.
	 * 
	 * @param chamado
	 */
	public void avaliar(Chamado chamado) {
		this.chamado = chamado;
		mostraCadastro();
		setAcoes(false, true);
	}

	/**
	 * Aprova uma ordem de serviço.
	 * 
	 */
	public void aprovar() {
		try {
			chamado.setUsuarioAutorizacao(usuarioBean.getUsuario());
			chamado = chamadoBO.aprovar(chamado);
			addFacesMessage(EnumResources.MS_012);
			pesquisar();
		} catch (ChamatecNegocioException e) {
			addFacesMessage(e.getMessage(), FacesMessage.SEVERITY_ERROR);
		} catch (Exception e) {
			montaMensagemGenerica(e);
		}
	}

	/**
	 * Valida se o chamado selecionado para aprovação já foi avaliado.
	 * 
	 * @param chamado
	 */
	public void validarAprovacao(Chamado chamado) {
		if (chamado.getIsAvaliado() == 0) {
			ChamatecExceptionCode msg = ChamatecExceptionCode.ME_014;
			addFacesMessage(msg, FacesMessage.SEVERITY_ERROR);
		}
	}
	
	/**
	 * Reprova uma ordem de serviço.
	 * 
	 */
	public void reprovar() {
		try {
			chamado.setUsuarioAutorizacao(usuarioBean.getUsuario());
			chamado = chamadoBO.reprovar(chamado);
			addFacesMessage(EnumResources.MS_013);
			pesquisar();
		} catch (ChamatecNegocioException e) {
			addFacesMessage(e.getMessage(), FacesMessage.SEVERITY_ERROR);
			setIsErro(true);
		} catch (Exception e) {
			montaMensagemGenerica(e);
			setIsErro(true);
		}
	}

	/**
	 * Valida se o chamado selecionado para reprovação já foi avaliado.
	 * 
	 * @param chamado
	 */
	public void validarReprovacao(Chamado chamado) {
		if (chamado.getIsAvaliado() == 0) {
			ChamatecExceptionCode msg = ChamatecExceptionCode.ME_015;
			addFacesMessage(msg, FacesMessage.SEVERITY_ERROR);
		}
	}

	/**
	 * Atualiza o Departamento de acordo com a Unidade selecionada.
	 * 
	 * @param event
	 */
	public void changeDepartamento(AjaxBehaviorEvent event) {
		departamentos = null;
		try {
			departamentos = departamentoBO.pesquisarUnidadePorDepartamento(chamado.getUnidade());
		} catch (ChamatecNegocioException e) {
			addFacesMessage(e.getMessage(), FacesMessage.SEVERITY_ERROR);
		} catch (Exception e) {
			montaMensagemGenerica(e);
		}
	}

	/**
	 * Atualiza o Departamento de acordo com a Unidade selecionada.
	 * 
	 * @param event
	 */
	public void changeDepartamentoSearch(AjaxBehaviorEvent event) {
		departamentos = null;
		try {
			departamentos = departamentoBO.pesquisarUnidadePorDepartamento(chamadoSearch.getUnidade());
		} catch (ChamatecNegocioException e) {
			addFacesMessage(e.getMessage(), FacesMessage.SEVERITY_ERROR);
		} catch (Exception e) {
			montaMensagemGenerica(e);
		}
	}
	/********************************************* Getters e Setters *****************************************************/
	/**
	 * @return the chamado
	 */
	public Chamado getChamado() {
		return chamado;
	}

	/**
	 * @param chamado the chamado to set
	 */
	public void setChamado(Chamado chamado) {
		this.chamado = chamado;
	}

	/**
	 * @return the chamadoSearch
	 */
	public Chamado getChamadoSearch() {
		return chamadoSearch;
	}

	/**
	 * @param chamadoSearch the chamadoSearch to set
	 */
	public void setChamadoSearch(Chamado chamadoSearch) {
		this.chamadoSearch = chamadoSearch;
	}

	/**
	 * @return the solicitanteSearch
	 */
	public Usuario getSolicitanteSearch() {
		return solicitanteSearch;
	}

	/**
	 * @param solicitanteSearch the solicitanteSearch to set
	 */
	public void setSolicitanteSearch(Usuario solicitanteSearch) {
		this.solicitanteSearch = solicitanteSearch;
	}

	/**
	 * @return the chamados
	 */
	public List<Chamado> getChamados() {
		return chamados;
	}

	/**
	 * @param chamados the chamados to set
	 */
	public void setChamados(List<Chamado> chamados) {
		this.chamados = chamados;
	}

	/**
	 * @return the unidades
	 */
	public List<Unidade> getUnidades() {
		return unidades;
	}

	/**
	 * @param unidades the unidades to set
	 */
	public void setUnidades(List<Unidade> unidades) {
		this.unidades = unidades;
	}

	/**
	 * @return the departamentos
	 */
	public List<Departamento> getDepartamentos() {
		return departamentos;
	}

	/**
	 * @param departamentos the departamentos to set
	 */
	public void setDepartamentos(List<Departamento> departamentos) {
		this.departamentos = departamentos;
	}

	/**
	 * @return the isAbrir
	 */
	public Boolean getIsAbrir() {
		return isAbrir;
	}

	/**
	 * @param isAbrir the isAbrir to set
	 */
	public void setIsAbrir(Boolean isAbrir) {
		this.isAbrir = isAbrir;
	}

	/**
	 * @return the isAvaliar
	 */
	public Boolean getIsAvaliar() {
		return isAvaliar;
	}

	/**
	 * @param isAvaliar the isAvaliar to set
	 */
	public void setIsAvaliar(Boolean isAvaliar) {
		this.isAvaliar = isAvaliar;
	}

	
}